@@ -3,6 +3,7 @@ |
||
3 | 3 |
from django.conf.urls import url |
4 | 4 |
|
5 | 5 |
from account import views as account_views |
6 |
+from group import views as group_views |
|
6 | 7 |
from photo import views as photo_views |
7 | 8 |
|
8 | 9 |
|
@@ -13,6 +14,11 @@ urlpatterns = [ |
||
13 | 14 |
url(r'^u/login$', account_views.user_login_api, name='user_login_api'), # 用户登录 |
14 | 15 |
] |
15 | 16 |
|
17 |
+urlpatterns = [ |
|
18 |
+ url(r'^g/create$', group_views.group_create_api, name='group_create_api'), # 群组创建 |
|
19 |
+ url(r'^g/join$', group_views.group_join_api, name='group_join_api'), # 申请加群 |
|
20 |
+] |
|
21 |
+ |
|
16 | 22 |
urlpatterns += [ |
17 | 23 |
url(r'^uuid_init$', photo_views.uuid_init, name='uuid_init'), # 生成唯一标识 |
18 | 24 |
url(r'^uuid$', photo_views.uuid, name='uuid'), # 获取唯一标识 |
@@ -10,3 +10,8 @@ |
||
10 | 10 |
4010 —— 参数错误 |
11 | 11 |
4011 —— 摄影师不存在 |
12 | 12 |
4012 —— 照片已存在 |
13 |
+ |
|
14 |
+ |
|
15 |
+3、群组信息 —— 402 |
|
16 |
+ 4020 —— 群组不存在 |
|
17 |
+ 4021 —— 群组已锁定 |
@@ -0,0 +1,25 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+ |
|
3 |
+from django.contrib import admin |
|
4 |
+ |
|
5 |
+from group.models import GroupInfo, GroupUserInfo, GroupPhotoInfo |
|
6 |
+ |
|
7 |
+ |
|
8 |
+class GroupInfoAdmin(admin.ModelAdmin): |
|
9 |
+ list_display = ('group_id', 'group_name', 'group_desc', 'group_from', 'group_lock', 'status', 'created_at', 'updated_at') |
|
10 |
+ list_filter = ('group_from', 'group_lock', 'status') |
|
11 |
+ |
|
12 |
+ |
|
13 |
+class GroupUserInfoAdmin(admin.ModelAdmin): |
|
14 |
+ list_display = ('group_id', 'user_id', 'nickname', 'admin', 'user_status', 'passed_at', 'refused_at', 'status', 'created_at', 'updated_at') |
|
15 |
+ list_filter = ('user_status', 'status') |
|
16 |
+ |
|
17 |
+ |
|
18 |
+class GroupPhotoInfoAdmin(admin.ModelAdmin): |
|
19 |
+ list_display = ('group_id', 'user_id', 'nickname', 'photo_path', 'photo_thumbnail_path', 'status', 'created_at', 'updated_at') |
|
20 |
+ list_filter = ('status', ) |
|
21 |
+ |
|
22 |
+ |
|
23 |
+admin.site.register(GroupInfo, GroupInfoAdmin) |
|
24 |
+admin.site.register(GroupUserInfo, GroupUserInfoAdmin) |
|
25 |
+admin.site.register(GroupPhotoInfo, GroupPhotoInfoAdmin) |
@@ -0,0 +1,69 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+from __future__ import unicode_literals |
|
3 |
+ |
|
4 |
+from django.db import models, migrations |
|
5 |
+ |
|
6 |
+ |
|
7 |
+class Migration(migrations.Migration): |
|
8 |
+ |
|
9 |
+ dependencies = [ |
|
10 |
+ ] |
|
11 |
+ |
|
12 |
+ operations = [ |
|
13 |
+ migrations.CreateModel( |
|
14 |
+ name='GroupInfo', |
|
15 |
+ fields=[ |
|
16 |
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), |
|
17 |
+ ('status', models.BooleanField(default=True, help_text='\u72b6\u6001', verbose_name='status')), |
|
18 |
+ ('created_at', models.DateTimeField(help_text='\u521b\u5efa\u65f6\u95f4', verbose_name='created_at', auto_now_add=True)), |
|
19 |
+ ('updated_at', models.DateTimeField(help_text='\u66f4\u65b0\u65f6\u95f4', verbose_name='updated_at', auto_now=True)), |
|
20 |
+ ('group_id', models.CharField(null=True, max_length=255, blank=True, help_text='\u7fa4\u7ec4\u552f\u4e00\u6807\u8bc6', unique=True, verbose_name='group_id', db_index=True)), |
|
21 |
+ ('group_name', models.CharField(help_text='\u7fa4\u7ec4\u540d\u79f0', max_length=255, null=True, verbose_name='group_name', blank=True)), |
|
22 |
+ ('group_desc', models.TextField(help_text='\u7fa4\u7ec4\u63cf\u8ff0', null=True, verbose_name='group_desc', blank=True)), |
|
23 |
+ ('group_from', models.IntegerField(default=0, help_text='\u7fa4\u7ec4\u6765\u6e90', verbose_name='group_from', choices=[(0, 'APP \u5efa\u7fa4'), (1, 'SESSION \u5efa\u7fa4')])), |
|
24 |
+ ('group_lock', models.BooleanField(default=False, help_text='\u7fa4\u7ec4\u9501\u5b9a', verbose_name='group_lock')), |
|
25 |
+ ], |
|
26 |
+ options={ |
|
27 |
+ 'verbose_name': 'groupinfo', |
|
28 |
+ 'verbose_name_plural': 'groupinfo', |
|
29 |
+ }, |
|
30 |
+ ), |
|
31 |
+ migrations.CreateModel( |
|
32 |
+ name='GroupPhotoInfo', |
|
33 |
+ fields=[ |
|
34 |
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), |
|
35 |
+ ('status', models.BooleanField(default=True, help_text='\u72b6\u6001', verbose_name='status')), |
|
36 |
+ ('created_at', models.DateTimeField(help_text='\u521b\u5efa\u65f6\u95f4', verbose_name='created_at', auto_now_add=True)), |
|
37 |
+ ('updated_at', models.DateTimeField(help_text='\u66f4\u65b0\u65f6\u95f4', verbose_name='updated_at', auto_now=True)), |
|
38 |
+ ('group_id', models.CharField(max_length=255, blank=True, help_text='\u7fa4\u7ec4\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='group_id', db_index=True)), |
|
39 |
+ ('user_id', models.CharField(help_text='\u7528\u6237\u552f\u4e00\u6807\u8bc6', max_length=255, null=True, verbose_name='user_id', blank=True)), |
|
40 |
+ ('nickname', models.CharField(help_text='\u7528\u6237\u7fa4\u7ec4\u6635\u79f0', max_length=255, null=True, verbose_name='nickname', blank=True)), |
|
41 |
+ ('photo_path', models.CharField(help_text='\u7167\u7247\u5b58\u653e\u8def\u5f84', max_length=255, null=True, verbose_name='photo_path', blank=True)), |
|
42 |
+ ('photo_thumbnail_path', models.CharField(help_text='\u7167\u7247\u7f29\u7565\u56fe\u5b58\u653e\u8def\u5f84', max_length=255, null=True, verbose_name='photo_thumbnail_path', blank=True)), |
|
43 |
+ ], |
|
44 |
+ options={ |
|
45 |
+ 'verbose_name': 'groupuserinfo', |
|
46 |
+ 'verbose_name_plural': 'groupuserinfo', |
|
47 |
+ }, |
|
48 |
+ ), |
|
49 |
+ migrations.CreateModel( |
|
50 |
+ name='GroupUserInfo', |
|
51 |
+ fields=[ |
|
52 |
+ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), |
|
53 |
+ ('status', models.BooleanField(default=True, help_text='\u72b6\u6001', verbose_name='status')), |
|
54 |
+ ('created_at', models.DateTimeField(help_text='\u521b\u5efa\u65f6\u95f4', verbose_name='created_at', auto_now_add=True)), |
|
55 |
+ ('updated_at', models.DateTimeField(help_text='\u66f4\u65b0\u65f6\u95f4', verbose_name='updated_at', auto_now=True)), |
|
56 |
+ ('group_id', models.CharField(max_length=255, blank=True, help_text='\u7fa4\u7ec4\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='group_id', db_index=True)), |
|
57 |
+ ('user_id', models.CharField(help_text='\u7528\u6237\u552f\u4e00\u6807\u8bc6', max_length=255, null=True, verbose_name='user_id', blank=True)), |
|
58 |
+ ('nickname', models.CharField(help_text='\u7528\u6237\u7fa4\u7ec4\u6635\u79f0', max_length=255, null=True, verbose_name='nickname', blank=True)), |
|
59 |
+ ('admin', models.BooleanField(default=False, help_text='\u7fa4\u7ec4\u7ba1\u7406\u5458', verbose_name='admin')), |
|
60 |
+ ('user_status', models.IntegerField(default=0, verbose_name='user_status', choices=[(0, '\u7533\u8bf7\u4e2d'), (1, '\u5df2\u901a\u8fc7'), (2, '\u5df2\u62d2\u7edd')])), |
|
61 |
+ ('passed_at', models.DateTimeField(help_text='\u901a\u8fc7\u65f6\u95f4', null=True, verbose_name='passed_at', blank=True)), |
|
62 |
+ ('refused_at', models.DateTimeField(help_text='\u62d2\u7edd\u65f6\u95f4', null=True, verbose_name='refused_at', blank=True)), |
|
63 |
+ ], |
|
64 |
+ options={ |
|
65 |
+ 'verbose_name': 'groupuserinfo', |
|
66 |
+ 'verbose_name_plural': 'groupuserinfo', |
|
67 |
+ }, |
|
68 |
+ ), |
|
69 |
+ ] |
@@ -0,0 +1,19 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+from __future__ import unicode_literals |
|
3 |
+ |
|
4 |
+from django.db import models, migrations |
|
5 |
+ |
|
6 |
+ |
|
7 |
+class Migration(migrations.Migration): |
|
8 |
+ |
|
9 |
+ dependencies = [ |
|
10 |
+ ('group', '0001_initial'), |
|
11 |
+ ] |
|
12 |
+ |
|
13 |
+ operations = [ |
|
14 |
+ migrations.AddField( |
|
15 |
+ model_name='groupinfo', |
|
16 |
+ name='session_id', |
|
17 |
+ field=models.CharField(max_length=255, blank=True, help_text='\u7167\u7247\u7ec4\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='session_id', db_index=True), |
|
18 |
+ ), |
|
19 |
+ ] |
@@ -0,0 +1,101 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+ |
|
3 |
+from django.conf import settings |
|
4 |
+from django.db import models |
|
5 |
+from django.utils.translation import ugettext_lazy as _ |
|
6 |
+ |
|
7 |
+from pai2.basemodels import CreateUpdateMixin |
|
8 |
+ |
|
9 |
+ |
|
10 |
+class GroupInfo(CreateUpdateMixin): |
|
11 |
+ APP_GROUP = 0 |
|
12 |
+ SESSION_GROUP = 1 |
|
13 |
+ |
|
14 |
+ GROUP_FROM = ( |
|
15 |
+ (APP_GROUP, u'APP 建群'), |
|
16 |
+ (SESSION_GROUP, u'SESSION 建群'), |
|
17 |
+ ) |
|
18 |
+ |
|
19 |
+ group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True, unique=True) |
|
20 |
+ group_name = models.CharField(_(u'group_name'), max_length=255, blank=True, null=True, help_text=u'群组名称') |
|
21 |
+ group_desc = models.TextField(_(u'group_desc'), blank=True, null=True, help_text=u'群组描述') |
|
22 |
+ group_from = models.IntegerField(_(u'group_from'), choices=GROUP_FROM, default=APP_GROUP, help_text=u'群组来源') |
|
23 |
+ session_id = models.CharField(_(u'session_id'), max_length=255, blank=True, null=True, help_text=u'照片组唯一标识', db_index=True) |
|
24 |
+ group_lock = models.BooleanField(_(u'group_lock'), default=False, help_text=u'群组锁定') |
|
25 |
+ |
|
26 |
+ class Meta: |
|
27 |
+ verbose_name = _(u'groupinfo') |
|
28 |
+ verbose_name_plural = _(u'groupinfo') |
|
29 |
+ |
|
30 |
+ def __unicode__(self): |
|
31 |
+ return unicode(self.group_id) |
|
32 |
+ |
|
33 |
+ @property |
|
34 |
+ def users(self): |
|
35 |
+ all_users = GroupUserInfo.objects.filter(group_id=self.group_id) |
|
36 |
+ applying_users = all_users.filter(user_status=GroupUserInfo.APPLYING) |
|
37 |
+ passed_users = all_users.filter(user_status=GroupUserInfo.PASSED) |
|
38 |
+ return { |
|
39 |
+ 'applying_count': applying_users.count(), |
|
40 |
+ 'passed_count': passed_users.count(), |
|
41 |
+ 'applying': [applying.user_info for applying in applying_users], |
|
42 |
+ 'passed': [passed.user_info for passed in passed_users], |
|
43 |
+ } |
|
44 |
+ |
|
45 |
+ |
|
46 |
+class GroupUserInfo(CreateUpdateMixin): |
|
47 |
+ APPLYING = 0 |
|
48 |
+ PASSED = 1 |
|
49 |
+ REFUSED = 2 |
|
50 |
+ |
|
51 |
+ USER_STATUS = ( |
|
52 |
+ (APPLYING, u'申请中'), |
|
53 |
+ (PASSED, u'已通过'), |
|
54 |
+ (REFUSED, u'已拒绝'), |
|
55 |
+ ) |
|
56 |
+ |
|
57 |
+ group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True) |
|
58 |
+ user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识') |
|
59 |
+ nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称') |
|
60 |
+ admin = models.BooleanField(_(u'admin'), default=False, help_text=u'群组管理员') |
|
61 |
+ user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS, default=APPLYING) |
|
62 |
+ passed_at = models.DateTimeField(_(u'passed_at'), blank=True, null=True, help_text=_(u'通过时间')) |
|
63 |
+ refused_at = models.DateTimeField(_(u'refused_at'), blank=True, null=True, help_text=_(u'拒绝时间')) |
|
64 |
+ |
|
65 |
+ class Meta: |
|
66 |
+ verbose_name = _(u'groupuserinfo') |
|
67 |
+ verbose_name_plural = _(u'groupuserinfo') |
|
68 |
+ |
|
69 |
+ def __unicode__(self): |
|
70 |
+ return unicode(self.pk) |
|
71 |
+ |
|
72 |
+ @property |
|
73 |
+ def user_info(self): |
|
74 |
+ return { |
|
75 |
+ 'user_id': self.user_id, |
|
76 |
+ 'nickname': self.nickname, |
|
77 |
+ 'admin': self.admin, |
|
78 |
+ } |
|
79 |
+ |
|
80 |
+ |
|
81 |
+class GroupPhotoInfo(CreateUpdateMixin): |
|
82 |
+ group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True) |
|
83 |
+ user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识') |
|
84 |
+ nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称') |
|
85 |
+ photo_path = models.CharField(_(u'photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径') |
|
86 |
+ photo_thumbnail_path = models.CharField(_(u'photo_thumbnail_path'), max_length=255, blank=True, null=True, help_text=u'照片缩略图存放路径') |
|
87 |
+ |
|
88 |
+ class Meta: |
|
89 |
+ verbose_name = _(u'groupuserinfo') |
|
90 |
+ verbose_name_plural = _(u'groupuserinfo') |
|
91 |
+ |
|
92 |
+ def __unicode__(self): |
|
93 |
+ return unicode(self.pk) |
|
94 |
+ |
|
95 |
+ @property |
|
96 |
+ def photo_url(self): |
|
97 |
+ return u'{0}/{1}'.format(settings.IMG_DOMAIN, self.photo_path) if self.photo_path else '' |
|
98 |
+ |
|
99 |
+ @property |
|
100 |
+ def photo_thumbnail_url(self): |
|
101 |
+ return u'{0}/{1}'.format(settings.IMG_DOMAIN, self.photo_thumbnail_path) if self.photo_thumbnail_path else '' |
@@ -0,0 +1,23 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+ |
|
3 |
+from rest_framework import serializers |
|
4 |
+ |
|
5 |
+from group.models import GroupInfo, GroupUserInfo, GroupPhotoInfo |
|
6 |
+ |
|
7 |
+ |
|
8 |
+class GroupInfoSerializer(serializers.HyperlinkedModelSerializer): |
|
9 |
+ class Meta: |
|
10 |
+ model = GroupInfo |
|
11 |
+ fields = ('group_id', 'group_name', 'group_desc', 'group_from', 'group_lock', 'status', 'created_at', 'updated_at') |
|
12 |
+ |
|
13 |
+ |
|
14 |
+class GroupUserInfoSerializer(serializers.HyperlinkedModelSerializer): |
|
15 |
+ class Meta: |
|
16 |
+ model = GroupUserInfo |
|
17 |
+ fields = ('group_id', 'user_id', 'nickname', 'admin', 'user_status', 'passed_at', 'refused_at', 'status', 'created_at', 'updated_at') |
|
18 |
+ |
|
19 |
+ |
|
20 |
+class GroupPhotoInfoSerializer(serializers.HyperlinkedModelSerializer): |
|
21 |
+ class Meta: |
|
22 |
+ model = GroupPhotoInfo |
|
23 |
+ fields = ('group_id', 'user_id', 'nickname', 'photo_path', 'photo_thumbnail_path', 'status', 'created_at', 'updated_at') |
@@ -0,0 +1,3 @@ |
||
1 |
+from django.test import TestCase |
|
2 |
+ |
|
3 |
+# Create your tests here. |
@@ -0,0 +1,106 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+ |
|
3 |
+from django.db import transaction |
|
4 |
+from django.http import JsonResponse |
|
5 |
+ |
|
6 |
+from rest_framework import viewsets |
|
7 |
+ |
|
8 |
+from account.models import UserInfo |
|
9 |
+from group.models import GroupInfo, GroupUserInfo, GroupPhotoInfo |
|
10 |
+from group.serializers import GroupInfoSerializer, GroupUserInfoSerializer, GroupPhotoInfoSerializer |
|
11 |
+ |
|
12 |
+from utils.ip_utils import ip_addr |
|
13 |
+ |
|
14 |
+from curtail_uuid import CurtailUUID |
|
15 |
+from TimeConvert import TimeConvert as tc |
|
16 |
+ |
|
17 |
+ |
|
18 |
+@transaction.atomic |
|
19 |
+def group_create_api(request): |
|
20 |
+ user_id = request.POST.get('user_id', '') |
|
21 |
+ |
|
22 |
+ try: |
|
23 |
+ user = UserInfo.objects.get(user_id=user_id) |
|
24 |
+ except UserInfo.DoesNotExist: |
|
25 |
+ return JsonResponse({ |
|
26 |
+ 'status': 4011, |
|
27 |
+ 'message': u'用户不存在', |
|
28 |
+ }) |
|
29 |
+ |
|
30 |
+ group_id = CurtailUUID.uuid(GroupInfo, 'group_id') |
|
31 |
+ group = GroupInfo.objects.create( |
|
32 |
+ group_id=group_id, |
|
33 |
+ group_from=GroupInfo.APP_GROUP, |
|
34 |
+ ) |
|
35 |
+ GroupUserInfo.objects.create( |
|
36 |
+ group_id=group_id, |
|
37 |
+ user_id=user_id, |
|
38 |
+ nickname=user.username, |
|
39 |
+ admin=True, |
|
40 |
+ user_status=GroupUserInfo.PASSED, |
|
41 |
+ passed_at=tc.utc_datetime(), |
|
42 |
+ ) |
|
43 |
+ |
|
44 |
+ return JsonResponse({ |
|
45 |
+ 'status': 200, |
|
46 |
+ 'message': u'群组创建成功', |
|
47 |
+ 'data': { |
|
48 |
+ 'group_id': group_id, |
|
49 |
+ 'users': group.users |
|
50 |
+ }, |
|
51 |
+ }) |
|
52 |
+ |
|
53 |
+ |
|
54 |
+def group_join_api(request): |
|
55 |
+ group_id = request.POST.get('group_id', '') |
|
56 |
+ user_id = request.POST.get('user_id', '') |
|
57 |
+ nickname = request.POST.get('nickname', '') |
|
58 |
+ |
|
59 |
+ try: |
|
60 |
+ user = UserInfo.objects.get(user_id=user_id) |
|
61 |
+ except UserInfo.DoesNotExist: |
|
62 |
+ return JsonResponse({ |
|
63 |
+ 'status': 4011, |
|
64 |
+ 'message': u'用户不存在', |
|
65 |
+ }) |
|
66 |
+ |
|
67 |
+ try: |
|
68 |
+ group = GroupInfo.objects.get(group_id=group_id) |
|
69 |
+ except GroupInfo.DoesNotExist: |
|
70 |
+ return JsonResponse({ |
|
71 |
+ 'status': 4020, |
|
72 |
+ 'message': u'群组不存在', |
|
73 |
+ }) |
|
74 |
+ if group.group_lock: |
|
75 |
+ return JsonResponse({ |
|
76 |
+ 'status': 4021, |
|
77 |
+ 'message': u'群组已锁定', |
|
78 |
+ }) |
|
79 |
+ |
|
80 |
+ GroupUserInfo.objects.create( |
|
81 |
+ group_id=group_id, |
|
82 |
+ user_id=user_id, |
|
83 |
+ nickname=nickname or user.username, |
|
84 |
+ admin=False, |
|
85 |
+ user_status=GroupUserInfo.APPLYING, |
|
86 |
+ ) |
|
87 |
+ |
|
88 |
+ return JsonResponse({ |
|
89 |
+ 'status': 200, |
|
90 |
+ 'message': u'申请已提交', |
|
91 |
+ }) |
|
92 |
+ |
|
93 |
+ |
|
94 |
+class GroupInfoViewSet(viewsets.ModelViewSet): |
|
95 |
+ queryset = GroupInfo.objects.all().order_by('-created_at') |
|
96 |
+ serializer_class = GroupInfoSerializer |
|
97 |
+ |
|
98 |
+ |
|
99 |
+class GroupUserInfoViewSet(viewsets.ModelViewSet): |
|
100 |
+ queryset = GroupUserInfo.objects.all().order_by('-created_at') |
|
101 |
+ serializer_class = GroupUserInfoSerializer |
|
102 |
+ |
|
103 |
+ |
|
104 |
+class GroupPhotoInfoViewSet(viewsets.ModelViewSet): |
|
105 |
+ queryset = GroupPhotoInfo.objects.all().order_by('-created_at') |
|
106 |
+ serializer_class = GroupPhotoInfoSerializer |
@@ -43,6 +43,7 @@ INSTALLED_APPS = ( |
||
43 | 43 |
'rest_framework', |
44 | 44 |
'api', |
45 | 45 |
'account', |
46 |
+ 'group', |
|
46 | 47 |
'photo', |
47 | 48 |
) |
48 | 49 |
|
@@ -22,13 +22,20 @@ from django.contrib import admin |
||
22 | 22 |
|
23 | 23 |
from rest_framework import routers |
24 | 24 |
from account import views as account_views |
25 |
+from group import views as group_views |
|
25 | 26 |
from photo import views as photo_views |
26 | 27 |
|
27 | 28 |
router = routers.DefaultRouter() |
28 | 29 |
# router.register(r'users', account_views.UserViewSet) |
29 | 30 |
# router.register(r'groups', account_views.GroupViewSet) |
31 |
+ |
|
30 | 32 |
router.register(r'lensmans', account_views.LensmanInfoViewSet) |
31 | 33 |
router.register(r'users', account_views.UserInfoViewSet) |
34 |
+ |
|
35 |
+router.register(r'groups', group_views.GroupInfoViewSet) |
|
36 |
+router.register(r'group_users', group_views.GroupUserInfoViewSet) |
|
37 |
+router.register(r'group_photos', group_views.GroupPhotoInfoViewSet) |
|
38 |
+ |
|
32 | 39 |
router.register(r'photos', photo_views.PhotoInfoViewSet) |
33 | 40 |
|
34 | 41 |
urlpatterns = [ |